<?php

/*!
 * \file AffectationController.php
 * \namespace Site\ProjetBundle\Controller
 * \author Brice VICO
 * \class AffectationController
 */

namespace Site\ProjetBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Site\ProjetBundle\Entity\Projet;
use Site\GeneralBundle\Entity\Ue;
use Site\GeneralBundle\Entity\Souhait;
use Site\GeneralBundle\Entity\SouhaitRepository;
use Site\UtilisateurBundle\Entity\Utilisateur;
use Site\UtilisateurBundle\Entity\Etudiant;

class AffectationController extends Controller
{

    /*!
     * \fn public function affectationManuelleAction($id)
     * \param $id l'id du projet
     * \return affectManu.html.twig
     * \author Brice VICO
     *
     * \brief Cette fonction affiche pour un projet $id, la liste des étudiants inscrit dans ce projet.
     * \brief Si il reste de la place dans celui-ci alors ajouterEtudiant(envoyé à la vue) sera egal à 1 et la vue affichera un formulaire d'ajout.
     * \brief Un message flash est affiché pour informer l'administrateur( voir afficherFlash, typeFlash et flash passés à la vue).
     */

    public function affectationManuelleAction($id)
    {
        $em = $this->getDoctrine()->getManager();

        $donneesProjet = $em->getRepository("SiteProjetBundle:Projet")->find($id);

        if (!$donneesProjet)
            throw new \Exception("Projet inexistant.");

        $listEtudiant = $donneesProjet->getEtudiants();
        $nbrRestant = $donneesProjet->getNbMaxEtud() - $donneesProjet->getNbInscritsEtud();

        if ($nbrRestant > 0)
        {
            if ($donneesProjet->getNbInscritsEtud() == 0)
                return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'info', 'flash' => 'Aucun étudiant n\'est affecté à ce projet.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
               else
                return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 0, 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
        }
        else
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 0, 'afficherFlash' => 0, 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
    }

    /*!
     * \fn public function affecterEtudManuAction($id)
     * \param $id l'id du projet
     * \return affectManu.html.twig
     * \author Brice VICO
     *
     * \brief Cette fonction permet d'ajouter un étudiant à un projet.
     * \brief Il est vérifié avant tout que l'étudiant n'appartienne pas déjà à un projet.
     */

    public function affecterEtudManuAction($id)
    {
        $request = $this->get('request');
        $em = $this->getDoctrine()->getManager();

        $donneesProjet = $em->getRepository("SiteProjetBundle:Projet")->find($id);
        $listEtudiant = $donneesProjet->getEtudiants();
        $nbrRestant = $donneesProjet->getNbMaxEtud() - $donneesProjet->getNbInscritsEtud();

        if ($request->getMethod() != 'POST')
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'danger', 'flash' => 'Vous n\'avez pas à affecter un étudiant sans penser par le formulaire.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
        else
        {
            if (!$donneesProjet)
                throw new \Exception("Projet inexistant.");

            $etudiant = $em->getRepository("SiteUtilisateurBundle:Etudiant")->findOneByNumEtud($request->get('numEtud'));

            if (!$etudiant)
                return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'danger', 'flash' => 'Etudiant inexistant.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));

            if ($etudiant->getProjet() != NULL)
                return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'danger', 'flash' => 'Etudiant déjà affecté.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));

            //$donneesProjet->setNbInscritsEtud($donneesProjet->getNbInscritsEtud() + 1);
            $donneesProjet->addEtudiant($etudiant);


            $etudiant->setProjet($donneesProjet);

            $em->persist($etudiant);
            $em->persist($donneesProjet);
            $em->flush();

            $nbrRestant = $donneesProjet->getNbMaxEtud() - $donneesProjet->getNbInscritsEtud();

        if ($nbrRestant > 0)
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'success', 'flash' => 'Etudiant affecté avec succès.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
        else
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 0, 'afficherFlash' => 1, 'typeFlash' => 'success', 'flash' => 'Etudiant affecté avec succès.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
        }
    }

    /*!
     * \fn public function supprimerAffectationAction($id, $idProjet)
     * \param $id l'id de l'étudiant à enlever
     * \param $idProjet l'id du projet dans lequel enlever l'étudiant
     * \return affectManu.html.twig
     * \author Brice VICO
     *
     * \brief Cette fonction permet de supprimer un étudiant d'un projet.
     */

    public function supprimerAffectationAction($id, $idProjet)
    {
        $em = $this->getDoctrine()->getManager();
        $etudiant = $em->getRepository("SiteUtilisateurBundle:Etudiant")->find($id);
        $projet = $em->getRepository("SiteProjetBundle:Projet")->find($idProjet);
        $listEtudiant = $projet->getEtudiants();

        $nbrRestant = $projet->getNbMaxEtud() - $projet->getNbInscritsEtud();

        if ($projet->getNbInscritsEtud() == 0)
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'danger', 'flash' => 'Il est impossible de supprimer un étudiant si il n\'y en a pas... Enfin, un peu de logique !', 'projet' => $projet, 'listEtud' => $listEtudiant));

        $projet->removeEtudiant($etudiant);
        $projet->setNbInscritsEtud($projet->getNbInscritsEtud() - 1);
        $etudiant->setProjet(NULL);

        $em->persist($projet);
        $em->persist($etudiant);
        $em->flush();


        $donneesProjet = $projet;
        if ($nbrRestant > 0)
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 1, 'afficherFlash' => 1, 'typeFlash' => 'success', 'flash' => 'Etudiant effacé du projet avec succès.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));
        else
            return $this->render('SiteProjetBundle:Affectation:affectManu.html.twig', array('ajouterEtudiant' => 0, 'afficherFlash' => 1, 'typeFlash' => 'success', 'flash' => 'Etudiant effacé du projet avec succès.', 'projet' => $donneesProjet, 'listEtud' => $listEtudiant));


    }
	
	/*!
     * \fn public function affectationChronoAction()
     * \return affectChrono.html.twig
     * \author Konig Jolan
     *
     * \brief Cette fonction affecte de manière chronologique les projets.
     * \brief Un message flash est affiché pour informer l'administrateur( voir afficherFlash, typeFlash et flash passés à la vue).
     */
	 
	 public function affectationChronoAction()
	 {
		$orm = $this->getDoctrine()->getManager();
		
		//récupération des souhaits
		$repositorySouhait = $orm->getRepository('SiteGeneralBundle:Souhait'); 
		$listeSouhaits=$repositorySouhait->trierParEtudiant();
		
		$flash="";
		$alerte='success';
		//affectation chronologique
		foreach($listeSouhaits as $Souhait)
		{
			if(!$Souhait->getEtudiant()->getProjet())
			{
				if($Souhait->getProjet()->getNbMaxEtud()-$Souhait->getProjet()->getNbInscritsEtud()>0)
				{
					$Souhait->getProjet()->addEtudiant($Souhait->getEtudiant());
					$Souhait->getEtudiant()->setProjet($Souhait->getProjet());
					$orm->persist($Souhait->getEtudiant());
					$orm->persist($Souhait->getProjet());
				}
			}
		}
		$orm->flush();
		
		//récupération des étudiants
		$repositoryEtudiant= $orm->getRepository('SiteUtilisateurBundle:Etudiant'); 
		$listeEtudiant=$repositorySouhait->findAll();
		
		//récupération des projets
		$repositoryProjet = $orm->getRepository('SiteProjetBundle:Projet');
		$listeProjets = $repositoryProjet->findAll();
		//vérifications
		foreach($listeEtudiant as $etudiant)
		{
			if(!$etudiant->getProjet())
			{	
				$flash.="L'étudiant n°".$etudiant->getNumEtud()." n'a pas de projet affecté !";
				$alerte='danger';
			}
		}
		foreach($listeProjets as $projet)
		{
			if($projet->getNbInscritsEtud()-$projet->getNbMinEtud()<0)
			{
				$flash.="Le projet ". $projet->getTitre()." n'a pas assez d'étudiant ";
				$alerte='danger';
			}
		}
		if($alerte=='success')
		{
			$flash= "affectation effectuée avec succès !";
		}
	
		 return $this->render('SiteGeneralBundle:Default:index.html.twig', array('listeProjets'=>$listeProjets, 'flash'=>$flash, 'alerte' => $alerte, 'afficher' => true));

	 }
}














